package com.appleyk.config6;

import com.appleyk.annotation.EnableRegistrarService;
import com.appleyk.service.CService;
import com.appleyk.service.Person;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

import java.util.Map;

/**
 * <p>越努力，越幸运</p>
 *
 * @author appleyk
 * @version V.0.1.1
 * @blob https://blog.csdn.net/appleyk
 * @date created on  11:09 下午 2020/12/9
 */
public class CImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {

        /**
         * 第一步，先注册一个bean定义进容器
         */
        System.out.println("ioc容器："+registry);
        Map<String, Object> attributes = importingClassMetadata
                .getAnnotationAttributes(EnableRegistrarService.class.getName());
        String value = (String) attributes.get("value");
        System.out.println("value = "+value);
        // 构建CService类的定义（描述信息）
        BeanDefinitionBuilder builder = BeanDefinitionBuilder
                .rootBeanDefinition(CService.class.getName())
                // 增加一个有参构造函数，并传值
                .addConstructorArgValue(value);
        // 将bean定义注册进ioc容器
        registry.registerBeanDefinition("cService",builder.getBeanDefinition());

        /**
         * 第二步，修改ioc容器中已存在的bean的定义
         * 因为registerBeanDefinitions会在@Bean之后执行，所以，在当前方法执行时，那些要修改的bean定义已经在ioc容器里了
         * 所以，下面我们直接取出修改即可
         */
        String personBeanName = Person.class.getSimpleName().toLowerCase();
        BeanDefinition beanDefinition = registry.getBeanDefinition(personBeanName);
        // 设置person类的初始化方法
        beanDefinition.setInitMethodName("initMethod");
        System.out.println("修改成功");
    }
}
